package com.powernode.lambda.lambda;


/**
 * 闭包作用：给函数对象提供参数之外的数据
 */
public class Lambda08 {
    public static void main(String[] args) {
        /**
         * 函数对象x -> a + x与外部变量z形成了闭包
         * 外部变量z必须为final 或effective final
         * effective final即虽然没有显式加final修饰，但行为上同final
         */
        int z = 10;
        method(x -> z + x);
        //z = 1; 一旦重新赋值，编译马上报错

    }

    @FunctionalInterface
    interface Lambda{
        int rt(int a);
    }

    static void method(Lambda lambda){
        System.out.println(lambda.rt( 1));
    }

    /**
     * 函数对象x -> a + x分别跟a、b、c形成闭包
     */
    static int a = 1;
    int b = 2;
    public void test(int c){
        method(x -> a + x);
        method(x -> b + x);
        method(x -> c + x);

    }
}
